package com.wgy.day29多线程.解决线程安全问题的方式.Lock锁;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by pc on 2020/11/27 22:04
 * Description: LearningJava
 */

class RunnableImpl implements Runnable {

    private static int ticket = 100;
    //1.在成员位置创建一个ReentrantLock对象
    Lock l = new ReentrantLock();


    @Override
    public void run() {
        //使用死循环,让卖票一直重复执行
        while (true) {
            //2.在可能出现安全问题的代码前调用Lock接口中的方法lock获取锁
            l.lock();
            if (ticket > 0) {
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                    //票存在,卖票,ticket--
                    System.out.println(Thread.currentThread().getName() + "-->正在买第" + ticket + "张票");
                    ticket--;
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    //3.在可能或出现安全问题的代码后调用Lock接口中的方法unlock释放锁
                    l.unlock();//无论程序是否异常,都会把锁释放
                }
            }
        }

    /*@Override
    public void run() {
        //使用死循环,让卖票一直重复执行
        while (true) {
          //2.在可能出现安全问题的代码前调用Lock接口中的方法lock获取锁
            l.lock();
            if (ticket > 0) {
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //票存在,卖票,ticket--
                System.out.println(Thread.currentThread().getName() + "-->正在买第" + ticket + "张票");
                ticket--;
            }
            //3.在可能或出现安全问题的代码后调用Lock接口中的方法unlock释放锁
            l.unlock();
        }*/


    }
}


